package leetcode

import "fmt"

func isMatch(s string, p string) bool {
	for i := 0; i < len(p); i++ {
		if i+1 < len(p) && p[i+1] == '*' {
			s = starIsMatch(s, p[i])
			continue
		}
		if p[i] == '*' {
			continue
		}
		if p[i] == '.' {
			if len(s) > 0 {
				s = s[1:]
			}
			continue
		}

		if len(s) == 0 || p[i] != s[0] {
			return false
		}
		if len(s) > 0 {
			s = s[1:]
		}
	}

	if s != "" {
		return false
	}

	return true
}

func starIsMatch(s string, c uint8) string {
	if c == '.' || c == '*' || s == "" {
		return ""
	}
	i := 0
	for ; i < len(s); i++ {
		if s[i] != c {
			break
		}
	}
	return s[i:]
}

func isMatchMethod2(s string, p string) bool {
	sl, pl := 0, 0
	star := false
	t := uint8(0)

	for sl < len(s) {
		if pl >= len(p) {
			if s[sl] != t {
				return false
			}
			sl++
			continue
		}

		if pl+1 < len(p) && p[pl+1] == '*' {
			t = s[sl]
			star = true
		}

		if !star {
			if p[pl] == '.' || s[sl] == p[pl] {
				pl++
				sl++
				continue
			}
			return false
		}

		if p[pl] != '.' && s[sl] != p[pl] {
			sl--
			pl = pl + 2
			star = false
		}
		sl++
	}
	if star {
		pl = pl + 2
	}

	if pl >= len(p) {
		return true
	}

	fmt.Println(string(t))

	for {
		if pl+1 < len(p) && p[pl+1] == '*' {
			pl = pl + 2
		}
		if pl >= len(p) {
			return false
		}
		if star && p[pl] == t {
			pl++
		}
		if pl == len(p) {
			return true
		}
		pl++
	}
}
